
from cprint import cprint
from pyKU import questionAI,deepseekAI,Agent,recordLog
from wcferry import Wcf, WxMsg
from OutPut.outPut import op
from queue import Empty     #queue是Python标准库中的一个模块，可以在多线程环境下安全地进行数据共享，Empty是一个异常类，它的功能主要是在队列为空时，如果尝试从队列中取出元素，那么此时就会引发Empty异常。
from datetime import datetime, timedelta
import schedule
import time
import os

class MainServer:
    def __init__(self,headTeacherID,headTeachertime):
        self.wcf = Wcf()
        # 开启全局接收
        self.wcf.enable_receiving_msg()
        # 好友名单，
        self.contacts = []
        # 用户信息
        self.user_info = []
        self.headTeacherID = headTeacherID
        self.headTeachertime = headTeachertime
        # 初始化服务以及配置
        # Thread(target=self.initConfig, name='初始化服务以及配置').start()

    # 每天上午箱班主任发送前一天问答数据及分西
    def job(self):

        # 每天早上定时发送前一天学生咨询问题的文件与AI分析
        # 生成昨日聊天日志的文件名
        # 获取当前日期和时间
        current_datetime = datetime.now()
        print("这是定时执行的任务，当前时间是:" + str(current_datetime) + "时整。")
        yesterday_datetime = current_datetime - timedelta(days=1)
        log_filename = './logs/' + yesterday_datetime.strftime("%Y-%m-%d") + ".txt"
        #log_filename = "./logs/2025-03-17.txt"
        # 判断日志文件是否存在
        if os.path.exists(log_filename):
            try:
                # 发送文件
                self.wcf.send_file(path=log_filename, receiver=self.headTeacherID)  # 仿佛不能用
                #print(f"文件 {file_path} 已发送给 {receiver_id}。")
            except Exception as e:
                print(f"发送文件失败：{e}")

            # 调用deepseek分析昨日学生问题
            content = ''
            try:
                # 打开文件并读取内容
                with open(log_filename, 'r', encoding='utf-8') as file:
                    content = file.read()
                    #print("文件内容：")
                    #print(content)
                    # 调用 deepseek
                    print('调用 deepseek')
                    ds = deepseekAI.DeepseekAI()
                    # 为了节约token，删去AI助手的回答
                    answer = ds.answer('你是AI教学助手，以下是天星桥中学高中某班学生群，学生咨询AI教学助手的问题，请使用简短文字归纳总结，问题有：'+content)
                    self.wcf.send_text(f"@{self.headTeacherID},'班主任,你好！以下AI助手对昨日学生咨询问题的总结分析：'\n"+answer,
                                       f"{self.headTeacherID}")

            except FileNotFoundError:
                print(f"错误：文件 {log_filename} 不存在。")
            except PermissionError:
                print(f"错误：没有读取文件 {log_filename} 的权限。")
            except UnicodeDecodeError:
                print(f"错误：文件 {log_filename} 的编码不支持。")
            except Exception as e:
                print(f"未知错误：{e}")
        else:
            self.wcf.send_text(f"班主任,你好！昨日没有收到同学们的问题。\n",
                               f"{self.headTeacherID}")

    def isLogin(self, ):
        """
        判断是否登录
        :return:
        """
        ret = self.wcf.is_login()
        if ret:
            # 获取全部的用户信息
            user_info = self.wcf.get_user_info()
            # 获取全部的联系人包括公众号和好友、群聊等
            self.contacts = self.wcf.get_contacts()
            
            cprint.info(f"""
               \t========== WXrobot V1.0 ========
               \t微信名：{user_info.get('name')}
               \t微信ID：{user_info.get('wxid')}
               \t手机号：{user_info.get('mobile')}
               \t系统运行中......
               \t========== mashaobin ===========       
               """.replace(' ', ''))

    def initConfig(self, ):
        """
        初始化数据库 缓存文件夹 开启定时推送服务
        :return:
        """

    def processMsg(self, ):
        # 判断是否登录
        self.isLogin()
        # self.wcf.query_sql('', '')
        # 已经登录不能够处于接收状态

        # 启动定时任务，执行前一天日志总结分析
        schedule.every().day.at(self.headTeachertime).do(self.job)

        while self.wcf.is_receiving_msg():
            contact = ''
            room_name = ''
            name = ''
            # 班主任ID：wxid_7770067700912
            # 助手：wxid_4ygksj1mnr3122
            # 每天早上定时发送前一天学生咨询问题的文件与AI分析
            schedule.run_pending()

            try:
                msg = self.wcf.get_msg()
                #print(msg)
                

                if '@chatroom' in msg.roomid:
                    # 群聊消息处理，教学助手只在教学群内回复@它的信息
                    answer = ''
                    # 根据ID查找群名称
                    for contact in self.contacts:
                        if contact.get('wxid') == msg.roomid:
                            room_name = contact.get('name')
                            break
                    for contact in self.contacts:
                        if contact.get('wxid') == msg.sender:
                            name = contact.get('name')
                            break

                    if '@AI教学助手' in msg.content:
                        op(f'-----------------\n[*]: 接收到消息\n[*]: 群聊名称: {room_name}\n[*]: 发送人: {name}\n[*]: 发送人ID: {msg.sender}\n[*]: 发送内容: {msg.content}\n---------------AI助手思考中---------------\n')
                        self.wcf.send_text("收到！思考中....", f"{msg.roomid}")
                        answer = Agent.questionService(msg.content)
                        print(f'[*]: 回复内容: {answer}')
                        #print(type(answer))
                        # 记录日志
                        #recordLog.recordChatLog(room_name, name, msg.content, answer)
                        recordLog.recordChatLog(room_name, name, msg.content) # 为了减少token计费，日志文件删去AI助手回到的问题
                        self.wcf.send_text(f"@{name},{answer}\n", f"{msg.roomid}", f"{msg.sender}")
                    else:
                        # 对于非@教学助手的留言，不做回答！
                        op(f'-----------------\n[*]: 接收到消息\n[*]: 群聊名称: {room_name}\n[*]: 发送人: {name}\n[*]: 发送人ID: {msg.sender}\n[*]: 发送内容: {msg.content}\n------------------群聊中------------------\n')

                    #Thread(target=self.Rmh.mainHandle, args=(msg,)).start()
                    #print('收到群聊信息')
                # 好友消息处理
                elif '@chatroom' not in msg.roomid and 'gh_' not in msg.sender:
                    #pass
                    # 根据ID查找好友的昵称
                    for contact in self.contacts:
                        if contact.get('wxid')  == msg.sender:
                            name = contact.get('name')
                            break
                    op(f'-----------------\n[*]: 接收到消息\n[*]: 好友昵称:  {name}\n[*]: 发送人ID: {msg.sender}\n[*]: 发送内容: {msg.content}\n----------------------------------------')
                    # 以后不单独回复给我的信息，只是在教学群内回复@我的信息
                    #answer = questionAI.question(msg.content)
                    # answer = Agent.questionService(msg.content)
                    answer = '你好，我是编程AI助手，不接受私聊，谢谢！'
                    self.wcf.send_text(name + '，' + answer +"\n", msg.sender)
                    #self.wcf.send_text('机器人发送消息', "在的，有什么事情吗？")
                    #Thread(target=self.Fmh.mainHandle, args=(msg,)).start()
                    #print('收到好友信息')
                else:
                    pass
            except Empty:
                continue


if __name__ == '__main__':
    ms = MainServer()
    ms.processMsg()
    pass


